<?php
/**
 * @author jonathan <jo.link.noir@gmail.com>
 * @version 1.0: jo_link_noir
 * @date 04-06-2010
 */
class U1_Building_DAO extends SW_Structure_DAO_Planet
{
	static private $factory = null;


	/**
	 * @return #field
	 */
	static public function getFactory()
	{
		return (self::$factory)
			? self::$factory
			: self::$factory = new self('planet', 'building', null, null, 'ref_user');
	}


	/**
	 * @param int $id
	 * @param int $group
	 * @param int $level
	 * @param int $id_planet = null
	 * @param int $duration = null
	 * @param array $price = null
	 * @param int $time_end = null
	 * @return U1_Building_Element
	 */
	protected function newElement($id, $group, $level, $id_planet = null, $duration = null, array $price = null, $time_end = null)
	{
		return new U1_Building_Element($id, $group, $level);
	}

	/**
	 * Insert une nouvelle liste de construction via un élement
	 * @param SW_Structure_Element $element
	 * @param int $timestamp
	 * @param int $idPlanet
	 * @param int $count : nombre pour faire évoluer la structure (ignoré)
	 * @return SW_Structure_List
	 */
	public function createList(SW_Structure_Element $element, $timestamp, $idPlanet, $count)
	{
		return parent::createList($element, $timestamp, $idPlanet, $element->getLevel() + 1);
	}

	/**
	 * Arrête la construction d'un élément
	 * @param SW_Structure $structure
	 * @param SW_Structure_List $list
	 * @param int $timestamp
	 */
	public function down(SW_Structure $structure, SW_Structure_List $list, $timestamp)
	{
		//calcule le remboursement (en fonction du temps écoulé, s'il n'a pas commencé on rembourse tous)
		$price = $structure->get($list->getIdElement())->getPrice();
		if ($list->getTimeEnd() - $list->getDuration() < $timestamp)
		{
			$increase = max(
				(SW_Race::getIndex('werlingz') === $structure->getPlayer()->getRace()) ? 0.05 : 0.2,
				($list->getTimeEnd() - $timestamp) / $list->getDuration()
			);
			foreach ($price as &$v)
				$v *= $increase;
		}
		$this->pdo->beginTransaction();
		//supprime la liste
		$this->deleteList($list->getId());
		//rembourse la structure
		$structure->getSiblingInstance(U1_Resource::INDEX)->increase($price, $timestamp);
		$this->pdo->commit();
	}

	/**
	 * Finit la construction d'un élément
	 * @param SW_Structure_Element $element
	 * @param SW_Structure_List $list
	 */
	public function finish(SW_Structure_Element $element, SW_Structure_List $list)
	{
		$element->setLevel($list->getLevel());
		parent::finish($element, $list);
	}
}